package alocador.entidades;

import java.util.Iterator;
import java.util.NoSuchElementException;

import alocador.exceptions.DataInvalidaException;
import alocador.exceptions.EventoInvalidoException;

/**
 * O pacote entidades diz respeito as entidades do Sistema, ou seja, Evento e Horario
 * Essa classe que modela a Entidade EventoNaoRepetitivo. Realiza todas operacoes relacionadas a um Evento nao Repetitivo
 */
public class EventoNaoRepetitivo extends Evento {

	//atributos especificos de Evento Nao Repetitivo
	private Horario horario;
	private int QTDHORARIOS = 1;

	//construtor de evento nao repetitivo
	public EventoNaoRepetitivo(String id, String nome, String inicio,
			String fim, String area, String contato)
			throws EventoInvalidoException, DataInvalidaException {
		super(id, nome, inicio, fim, area, contato, 0);
		
		Horario horario = new Horario(inicio, fim);
		this.horario = horario;
	}

	/**
	 * Retorna a lista contendo todos horarios de um evento
	 * @return 
	 * 		Horario de um evento
	 */
	@Override
	protected Horario getHorariosDoEvento() {
		return this.horario;
	}

	/**
	 * Retorna Horario do Evento
	 * @return
	 * 		Horario do Evento
	 */
	public Horario getHorario() {
		return this.horario;
	}

	/**
	 * Retorna Quantidade de Horarios de um Evento
	 * @return
	 * 		Quantidade de Horarios de um Evento
	 */
	@Override
	public int numDeHorarios() {
		return QTDHORARIOS;
	}

	/**
	 * Verifica se Evento contem determinado Horario
	 * @param data
	 *      Data a ser verificada
	 * @return 
	 * 		True, caso Evento contenha horario. False, caso contrario
	 * @throws DataInvalidaException
	 * 		Caso a data esteja em formato errado, 30/02, por exemplo
	 */
	@Override
	protected boolean contemHorario(String data) throws DataInvalidaException {

		if (getHorariosDoEvento().contemHorario(data)) {
			return true;
		}

		return false;
	}
	
	/**
	 * Itera sobre o(s) horario(s) de um Evento
	 * @return
	 * 		Iterator de um Horario
	 */
	@Override
	public Iterator<Horario> horarioIterator() {
		return new Iterator<Horario>(){
			int cursor = 0;
			@Override
			public boolean hasNext() {
				return cursor < numDeHorarios();
			}

			@Override
			public Horario next() {
				try{
					Horario next = getHorario();
					cursor++;
					return next;
				} catch (NoSuchElementException e){
					throw new IllegalArgumentException("Evento nao existente");
				}
			}

			@Override
			public void remove() {
				
			}
			
		};
	}

	/**
	 * Retorna as informacoes de um Evento nao Repetitivo
	 * @return
	 * 	Informacoes de um Evento nao Repetitivo
	 */
	@Override
	public String toString() {
	
		String saida  = "";
		
		saida += "Nome: " + getNome() + "Area: " + getArea() + "Contato: " + getContato() + "Horario(s): " + getHorario() +
			"Data de Inicio: " + horario.getDataInicio() + "Data de Termino: " + horario.getDataFim();
		
		return saida;
		
	}
	
}
